home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / gfxfx / maketab.pas < prev    next >
Pascal/Delphi Source File  |  1994-04-20  |  5KB  |  234 lines

  1. {$N+}
  2.  
  3. program MakeCoSinTab;
  4. { Make several kinds of tables - select one, by Bas van Gaalen, Holland, PD }
  5. uses
  6.   crt;
  7.  
  8. const
  9.   TabLen = 255;
  10.  
  11. var
  12.   TabFile : text;
  13.   Table : array[0..TabLen] of integer;
  14.  
  15. {----------------------------------------------------------------------------}
  16.  
  17. procedure SinTab;
  18.  
  19. var
  20.   I : byte;
  21.  
  22. begin
  23.   clrscr;
  24.   for I := 0 to TabLen do begin
  25.     Table[I] := round(sin((2*pi/TabLen)*I)*128);
  26.     if I mod 20 = 19 then writeln(TabFile);
  27.     write(TabFile,Table[I],',');
  28.   end;
  29. end;
  30.  
  31. {----------------------------------------------------------------------------}
  32.  
  33. procedure Globe1;
  34.  
  35. type CoorRec = record X,Y,Z : integer; end;
  36.  
  37. var
  38.   Phi,Theta : real;
  39.   I : word;
  40.   X,Y,Z : integer;
  41.   Range : byte;
  42.  
  43. {
  44. r (of rho) : afstand tot de oorsprong, r>=0;
  45.  
  46. fi         : hoek in x-y-vlak met x-as, loopt van 0 tot pi
  47.  
  48. theta      : hoek met de z-as, loopt van 0 tot 2pi.
  49.  
  50. De cartesische coordinaten van een punt zijn dan gegeven door:
  51.  
  52. x = r * sin theta * cos fi
  53. y = r * sin theta * sin fi
  54. z = r * cos theta
  55. }
  56.  
  57. begin
  58.   randomize;
  59.   Range := 30;
  60.   for I := 0 to TabLen do begin
  61.     Phi := random(3142)/1000;
  62.     Theta := random(6283)/1000;
  63.     X := round(Range*sin(Theta)*cos(Phi));
  64.     Y := round(Range*sin(Theta)*sin(Phi));
  65.     Z := round(Range*cos(Theta));
  66.  
  67.     writeln('X = ',X:4,';   Y = ',Y:4,';   Z = ',Z:4);
  68.  
  69.     if I mod 5 = 4 then writeln(TabFile);
  70.     write(TabFile,'(',X,',',Y,',',Z,'),');
  71.   end;
  72. end;
  73.  
  74. {----------------------------------------------------------------------------}
  75.  
  76. procedure Globe2;
  77.  
  78. const
  79.   R = 50;
  80.  
  81. var
  82.   Range : real;
  83.   A,B,C : integer;
  84.   X,Y,Z : integer;
  85.   I : byte;
  86. {
  87. A wordt random getrokken uit (-R, +R)
  88. B wordt random getrokken uit (-R, +R)
  89. C wordt random getrokken uit (-R, +R)
  90.  
  91. Nu ligt het punt (A, B, C) random in het inwendige van een kubus die om de
  92. bol heen ligt.  Verbind dit punt met het middelpunt van de bol, en snij de
  93. verbindingslijn met het oppervlakte.  Kies het snijpunt dat aan dezelfde
  94. kant van (0, 0, 0) ligt als (A, B, C).
  95.  
  96. Afstand = wortel(A^2 + B^2 + C^2)
  97. X = A * R / afstand
  98. Y = B * R / afstand
  99. Z = C * R / afstand
  100.  
  101. (X, Y, Z) ligt nu op het oppervlakte van de bol.  Niet helemaal random
  102. overigens want punten in de buurt van de hoeken ven de kubus zijn
  103. waarschijnlijker dan andere.  Maar ik denk dat het voor jouw doel
  104. goed genoeg is.
  105. }
  106.  
  107. begin
  108.   randomize;
  109.  
  110.   for I := 0 to TabLen do begin
  111.     A := random(2*R)-R;
  112.     B := random(2*R)-R;
  113.     C := random(2*R)-R;
  114.     Range := sqrt(A*A+B*B+C*C);
  115.     X := round(A*R/Range);
  116.     Y := round(B*R/Range);
  117.     Z := round(C*R/Range);
  118.  
  119.     writeln('X = ',X:4,';   Y = ',Y:4,';   Z = ',Z:4);
  120.     if I mod 5 = 4 then writeln(TabFile);
  121.     write(TabFile,'(',X,',',Y,',',Z,'),');
  122.   end;
  123. end;
  124.  
  125. {----------------------------------------------------------------------------}
  126.  
  127. procedure MakeKlok;
  128.  
  129. {ps. voor mensen met coprocessor is double of single in
  130.  $N+ mode ALTIJD sneller omdat dat je een conversieslag
  131.  uitspaart}
  132.  
  133. const
  134.   size = 1.5;
  135.   res = 25;
  136.  
  137. var
  138.   fie,xi,yi,i : integer;
  139.   x,y,z : real;
  140.  
  141. begin
  142.   i := 0;
  143.   xi := -res;
  144.   while xi < res do begin
  145.     yi := -res;
  146.     while yi < res do begin
  147.       x:=xi/res*size; y:=yi/res*size;
  148.       z:=2*exp(-sqr(x)-sqr(y));
  149.  
  150.       writeln('x = ',round(x*50):4,';   y = ',round(y*50):4,';   z = ',round(z*50):4);
  151.       if i mod 5 = 4 then writeln(TabFile);
  152.       write(TabFile,'(',round(x*50),',',round(y*50),',',round(z*50),'),');
  153.  
  154.       inc(yi,4);
  155.       inc(i);
  156.     end;
  157.     inc(xi,4);
  158.   end;
  159.   writeln;
  160.   writeln('Number of values: ',i);
  161. end;
  162.  
  163. {----------------------------------------------------------------------------}
  164.  
  165. procedure Parabole;
  166.  
  167. const
  168.   Max = 125;
  169.  
  170. var
  171.   I : real;
  172.   J : word;
  173.  
  174. begin
  175.   J := 0; I := -sqrt(Max);
  176.   while I <= sqrt(Max) do begin
  177.     writeln(round(sqr(I)));
  178.     I := I+0.0875;
  179.     if J mod 20 = 19 then writeln(TabFile);
  180.     write(TabFile,round(sqr(I)),',');
  181.     inc(J);
  182.   end;
  183.   writeln;
  184.   writeln('Number of values: ',J);
  185. end;
  186.  
  187. {----------------------------------------------------------------------------}
  188.  
  189. procedure ConvSinus;
  190.  
  191. const
  192.   Ampl : byte = 40;
  193.  
  194. var
  195.   Step,Divider : real;
  196.   SinVal : word;
  197.   I,J,X,Y : byte;
  198.  
  199. begin
  200.   X := 1; Y := 1; Ampl := Ampl div 2;
  201.   Step := Ampl/800; Divider := 1;
  202.   for I := 0 to 255 do begin
  203.     SinVal := round(((sin(8*I*pi/255)*Ampl)+Ampl)/Divider);
  204.     Divider := Divider+Step;
  205.  
  206.     gotoxy(X,Y); write(SinVal:4);
  207.     if wherey > 49 then begin
  208.       inc(X,5);
  209.       Y := 1;
  210.     end else inc(Y);
  211.  
  212.     if J mod 20 = 19 then writeln(TabFile);
  213.     write(TabFile,SinVal,',');
  214.     inc(J);
  215.  
  216.   end;
  217.   repeat until keypressed;
  218. end;
  219.  
  220. {----------------------------------------------------------------------------}
  221.  
  222. begin
  223.   clrscr;
  224.   assign(TabFile,'SINTAB.DAT');
  225.   rewrite(TabFile);
  226.   {MakeKlok;}
  227.   {Globe1;}
  228.   {Parabole;}
  229.   {ConvSinus;}
  230.   SinTab;
  231.   close(TabFile);
  232.   repeat until keypressed;
  233. end.
  234.